/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package mapa;

import buscaemamplitude.Estado;
import buscaemamplitude.EstadoObject;
import buscaemamplitude.Problema;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Administrador
 */
public class ProblemaMapa implements Problema {
    
    private static int REGRA_CIDADE_VIZINHA = 1;
    private int[][] mapa = {{-1, 24, -1, -1, -1, 45, 82, -1, -1, -1, -1, -1, 140, -1, -1, 84, -1, -1, -1}, {24, -1, 97, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, 97, -1, 14, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, 14, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, 23, -1, -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {45, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {82, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, 52, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, 94, -1, -1, 56, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, 29, -1, 31, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, 80, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, -1, -1, 69, -1, -1, -1, -1}, {140, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 96, -1, 129, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 69, -1, 129, -1, -1, -1, 136, -1}, {84, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, 256, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 136, -1, 256, -1, 45}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1}};

    @Override
    public EstadoObject getEstadoInicial() {
        return new EstadoObjectMapa(this.getIdfromCidade("Farroupilha"));
    }

    @Override
    public EstadoObject getEstadoFinal() {
        return new EstadoObjectMapa(this.getIdfromCidade("Florianópolis"));
    }

    @Override
    public List<Estado> explorar(EstadoObject estadoObject) {
        EstadoObjectMapa estadoObjectMapa = (EstadoObjectMapa) estadoObject;        
        List<Estado> list = new ArrayList();
        
        for (int i = 0; i<mapa.length; i++) {
            if (mapa[estadoObjectMapa.getCidade()][i] >= 0) {
                list.add(new Estado(new EstadoObjectMapa(i), REGRA_CIDADE_VIZINHA, mapa[estadoObjectMapa.getCidade()][i]));
            }
        }
        
        return list;        
    }

    public static String getNomeCidade(int id) {
        switch (id) {
            case 0:
                return "Caxias do Sul";
            case 1:
                return "Farroupilha";
            case 2:
                return "Novo Hamburgo";
            case 3:
                return "Sapucaia do Sul";
            case 4:
                return "Porto Alegre";
            case 5:
                return "Nova Petrópolis";
            case 6:
                return "Taquara";
            case 7:
                return "Sto Antônio da Patrulha";
            case 8:
                return "Osório";
            case 9:
                return "Capão da Canoa";
            case 10:
                return "Torres";
            case 11:
                return "Sombrio";
            case 12:
                return "Bom Jesus";
            case 13:
                return "Timbé do Sul";
            case 14:
                return "Tubarão";
            case 15:
                return "Vacaria";
            case 16:
                return "Lages";
            case 17:
                return "Palhoça";
            case 18:
                return "Florianópolis";
            default:
                return "Cidade Desconhecida";
        }
    }

    public int getIdfromCidade(String nomeCidade) {
        String aux;
        for (int i = 0; i < mapa.length; i++) {
            aux = this.getNomeCidade(i);
            if (nomeCidade.compareToIgnoreCase(aux) == 0) {
                return i;
            }
        }
        return -1;
    }

    @Override
    public float getCustoEstimado(EstadoObject estadoObject) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
